#!/usr/bin/env python3
"""
V22 Clip Generator v2 — Uses ffmpeg directly for zoompan + highlights.
Much faster than moviepy for batch rendering.
"""

import os
import subprocess
import shutil

BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
IMAGES_DIR = os.path.join(BASE, "02_images")
CLIPS_DIR = os.path.join(BASE, "03_clips")
FFMPEG = "D:/AI_WORKSPACE/tools/ffmpeg/ffmpeg.exe"
FPS = 30
W, H = 1080, 1920

os.makedirs(CLIPS_DIR, exist_ok=True)


def run_ffmpeg(args, desc):
    """Run ffmpeg with args."""
    cmd = [FFMPEG] + args
    print(f"  Running: {' '.join(cmd[:8])}...")
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        print(f"  STDERR: {result.stderr[:500]}")
        raise RuntimeError(f"ffmpeg failed for {desc}")
    print(f"  OK: {desc}")


def make_clip_01():
    """Terminal failure — zoom into error lines, red highlight."""
    out = os.path.join(CLIPS_DIR, "clip_01_hook.mp4")
    inp = os.path.join(IMAGES_DIR, "01_hook_terminal_problem.png")

    # zoompan: start at 1.0, zoom to 1.3 over 5s, then back to 1.1
    # drawbox at error line positions (y~480 area)
    vf = (
        "zoompan=z='if(lte(in,150),1+0.002*in,1.3-0.001*(in-150))':"
        f"d=240:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=1080x1920:fps={FPS},"
        "drawbox=x=80:y=480:w=920:h=40:color=red@0.25:t=fill:enable='between(n,30,100)',"
        "drawbox=x=80:y=520:w=920:h=40:color=red@0.25:t=fill:enable='between(n,40,110)',"
        "drawbox=x=80:y=560:w=920:h=40:color=red@0.25:t=fill:enable='between(n,50,120)'"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "8", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_01_hook")


def make_clip_02():
    """Bad CSV — scroll table, highlight empty rows."""
    out = os.path.join(CLIPS_DIR, "clip_02_bad_csv.mp4")
    inp = os.path.join(IMAGES_DIR, "02_bad_csv_evidence.png")

    vf = (
        "zoompan=z='1+0.0008*in':x='iw/2-(iw/zoom/2)':"
        f"y='ih/2-(ih/zoom/2)-0.5*in':d=210:s=1080x1920:fps={FPS},"
        "drawbox=x=80:y=346:w=920:h=44:color=red@0.2:t=fill:enable='between(n,30,80)',"
        "drawbox=x=80:y=394:w=920:h=44:color=red@0.2:t=fill:enable='between(n,40,90)',"
        "drawbox=x=80:y=538:w=920:h=44:color=red@0.2:t=fill:enable='between(n,50,100)',"
        "drawbox=x=80:y=586:w=920:h=44:color=red@0.2:t=fill:enable='between(n,60,110)'"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "7", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_02_bad_csv")


def make_clip_03():
    """Quality gate code — pan through code, highlight sections."""
    out = os.path.join(CLIPS_DIR, "clip_03_quality_gate.mp4")
    inp = os.path.join(IMAGES_DIR, "03_quality_gate_code.png")

    vf = (
        f"zoompan=z='1+0.001*in':x='iw/2-(iw/zoom/2)':"
        f"y='ih/2-(ih/zoom/2)-1.5*in':d=240:s=1080x1920:fps={FPS},"
        "drawbox=x=260:y=260:w=500:h=55:color=yellow@0.3:t=fill:enable='between(n,30,90)',"
        "drawbox=x=160:y=450:w=450:h=40:color=blue@0.3:t=fill:enable='between(n,105,165)',"
        "drawbox=x=150:y=960:w=500:h=40:color=green@0.3:t=fill:enable='between(n,180,230)'"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "8", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_03_quality_gate")


def make_clip_04():
    """Terminal success — zoom into green PASSED."""
    out = os.path.join(CLIPS_DIR, "clip_04_success.mp4")
    inp = os.path.join(IMAGES_DIR, "04_fixed_terminal_success.png")

    vf = (
        "zoompan=z='if(lte(in,120),1.0+0.002*in,1.25-0.001*(in-120))':"
        f"x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)-40':d=180:s=1080x1920:fps={FPS},"
        "drawbox=x=300:y=670:w=450:h=55:color=green@0.3:t=fill:enable='between(n,60,130)',"
        "drawbox=x=300:y=700:w=450:h=55:color=green@0.3:t=fill:enable='between(n,130,175)'"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "6", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_04_success")


def make_clip_05():
    """TOP20 table — highlight gold/silver/bronze rows."""
    out = os.path.join(CLIPS_DIR, "clip_05_top20.mp4")
    inp = os.path.join(IMAGES_DIR, "05_top20_table.png")

    vf = (
        f"zoompan=z='1+0.0008*in':x='iw/2-(iw/zoom/2)':"
        f"y='ih/2-(ih/zoom/2)-1.0*in':d=210:s=1080x1920:fps={FPS},"
        "drawbox=x=100:y=286:w=880:h=44:color=yellow@0.25:t=fill:enable='between(n,30,90)',"
        "drawbox=x=100:y=330:w=880:h=44:color=silver@0.25:t=fill:enable='between(n,75,135)',"
        "drawbox=x=100:y=374:w=880:h=44:color=orange@0.25:t=fill:enable='between(n,120,180)'"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "7", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_05_top20")


def make_clip_06():
    """Before-After — pan from left to right."""
    out = os.path.join(CLIPS_DIR, "clip_06_compare.mp4")
    inp = os.path.join(IMAGES_DIR, "06_before_after_compare.png")

    vf = (
        f"zoompan=z='1+0.0005*in':"
        f"x='if(lte(in,105),iw/2-(iw/zoom/2),iw/2-(iw/zoom/2)-300*(min((in-105)/60,1)))':"
        f"y='ih/2-(ih/zoom/2)':d=210:s=1080x1920:fps={FPS}"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "7", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_06_compare")


def make_clip_07():
    """Pipeline flow — zoom through boxes."""
    out = os.path.join(CLIPS_DIR, "clip_07_flow.mp4")
    inp = os.path.join(IMAGES_DIR, "07_pipeline_flow.png")

    vf = (
        "zoompan=z='if(lte(in,40),1,if(lte(in,100),1.3,if(lte(in,140),1.3,1.1)))':"
        f"x='if(lte(in,40),iw/2-(iw/zoom/2),if(lte(in,100),iw/2-(iw/zoom/2)-80,iw/2-(iw/zoom/2)+160))':"
        f"y='if(lte(in,40),ih/2-(ih/zoom/2),if(lte(in,100),ih/2-(ih/zoom/2)-40,ih/2-(ih/zoom/2)+120))':"
        f"d=180:s=1080x1920:fps={FPS},"
        "drawbox=x=60:y=410:w=340:h=180:color=orange@0.25:t=fill:enable='between(n,50,100)',"
        "drawbox=x=620:y=410:w=340:h=180:color=yellow@0.25:t=fill:enable='between(n,120,170)'"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "6", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_07_flow")


def make_clip_08():
    """Final decision — zoom into key text."""
    out = os.path.join(CLIPS_DIR, "clip_08_decision.mp4")
    inp = os.path.join(IMAGES_DIR, "08_final_decision_card.png")

    vf = (
        f"zoompan=z='1+0.001*in':"
        f"x='iw/2-(iw/zoom/2)':"
        f"y='if(lte(in,90),ih/2-(ih/zoom/2)-50,ih/2-(ih/zoom/2))':"
        f"d=180:s=1080x1920:fps={FPS},"
        "drawbox=x=180:y=480:w=720:h=60:color=green@0.25:t=fill:enable='between(n,60,130)'"
    )
    args = [
        "-y", "-loop", "1", "-i", inp,
        "-vf", vf,
        "-t", "6", "-r", str(FPS),
        "-c:v", "libx264", "-preset", "fast", "-crf", "22",
        "-pix_fmt", "yuv420p", out
    ]
    run_ffmpeg(args, "clip_08_decision")


def main():
    makers = [
        ("clip_01_hook", make_clip_01),
        ("clip_02_bad_csv", make_clip_02),
        ("clip_03_quality_gate", make_clip_03),
        ("clip_04_success", make_clip_04),
        ("clip_05_top20", make_clip_05),
        ("clip_06_compare", make_clip_06),
        ("clip_07_flow", make_clip_07),
        ("clip_08_decision", make_clip_08),
    ]

    for name, maker in makers:
        print(f"\n--- {name} ---")
        maker()

    # Check sizes
    print("\n=== ALL CLIPS GENERATED ===")
    total_size = 0
    for name, _ in makers:
        path = os.path.join(CLIPS_DIR, f"{name}.mp4")
        if os.path.exists(path):
            size = os.path.getsize(path)
            total_size += size
            print(f"  {name}.mp4: {size/1024/1024:.1f} MB")
    print(f"Total: {total_size/1024/1024:.1f} MB")


if __name__ == "__main__":
    main()
